package config

import (
	"embed"
	"encoding/json"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"os"
)

var config *Config

//go:embed default.json
var _default embed.FS

// Config 初始化配置项
type Config struct {
	RunAddr  string `json:"run_addr"`
	RunModel string `json:"run_model"`
	MySQL    *MySQL `json:"mysql"` // MySQL
	Redis    *Redis `json:"redis"` // Redis
}

// MySQL 配置项
type MySQL struct {
	DNS    string   `json:"dns"`     // 数据库DNS链接 关联utils.DB
	DNSPET string   `json:"dns_pet"` // 数据库DNSPET链接 关联utils.DB
	DB     *gorm.DB // 农业园林数据库连接
	DBPET  *gorm.DB // 宠物数据库连接
}

// Redis 配置项
type Redis struct {
	Addr      string `json:"addr"`       // 地址，IP:端口
	Pass      string `json:"pass"`       // 密码
	ClientNum uint8  `json:"client_num"` // 选择数据库，0-15
}

// 加载配置文件列表
var fileList = []string{
	"/etc/go-gin-api/go-gin-api.json",
	"/etc/go-gin-api/config.json",
	"/etc/go-gin-api.json",
	"config.json",
	".env.json",
	"C:/Users/xiaoyutab/Documents/src/gogs.bjtec.xinfushenghuo.cn/xingfushenghuo/coupon/config.json",
	"C:/Users/xiaoyutab/Documents/src/gogs.bjtec.xinfushenghuo.cn/xingfushenghuo/coupon/.env.json",
	"E:/repo.lawxp.com/coupon/.env.json",
	"/home/xiaoyutab/go/src/gogs.bjtec.xinfushenghuo.cn/xinfushenghuo/coupon/.env.json",
	"/home/xiaoyutab/go/src/gogs.bjtec.xinfushenghuo.cn/xinfushenghuo/coupon/.env.json",
	"D:/repo.lawxp.com/agricultureApi/.env.json",
}

func GetConfig() *Config {
	if config == nil {
		config = &Config{}
		b, err := _default.ReadFile("default.json")
		if err != nil {
			panic("默认配置文件加载失败")
		}
		err = json.Unmarshal(b, config)
		if err != nil {
			panic("默认配置文件读取失败")
		}

		for _, v := range fileList {
			if _, err := os.Stat(v); err == nil {
				conf := &Config{}
				fp, err := os.OpenFile(v, os.O_RDONLY, 0775)
				if err != nil {
					panic("配置文件读取错误" + err.Error())
				}
				data := make([]byte, 1<<16) // 读取配置文件，限制配置文件大小为64KB
				n, err := fp.Read(data)
				if err != nil {
					panic("配置文件读取错误：" + err.Error())
				}
				err = json.Unmarshal(data[:n], conf) // 格式化JSON
				if err != nil {
					panic("JSON文件格式错误【" + v + "】：" + err.Error())
				}
				if conf.RunAddr != "" {
					config.RunAddr = conf.RunAddr
				}
				if conf.RunModel != "" {
					config.RunModel = conf.RunModel
				}
				// MySQL
				if conf.MySQL != nil {
					if conf.MySQL.DNS != "" {
						config.MySQL.DNS = conf.MySQL.DNS
					}
					if conf.MySQL.DNSPET != "" {
						config.MySQL.DNSPET = conf.MySQL.DNSPET
					}
				}
				// Redis
				if conf.Redis != nil {
					if conf.Redis.Addr != "" {
						config.Redis.Addr = conf.Redis.Addr
					}
					if conf.Redis.Pass != "" {
						config.Redis.Pass = conf.Redis.Pass
					}
					if conf.Redis.ClientNum > 0 {
						config.Redis.ClientNum = conf.Redis.ClientNum
					}
				}
			}
		}
	}
	// 连接数据库
	if config.MySQL.DB == nil {
		db, err := gorm.Open(mysql.Open(config.MySQL.DNS), &gorm.Config{})
		if err != nil {
			panic("数据库连接异常: " + err.Error())
		}
		config.MySQL.DB = db
	}
	if config.MySQL.DBPET == nil {
		db, err := gorm.Open(mysql.Open(config.MySQL.DNSPET), &gorm.Config{})
		if err != nil {
			panic("数据库连接异常: " + err.Error())
		}
		config.MySQL.DBPET = db
	}
	return config
}
